package routers

import (
	"github.com/gin-gonic/gin"
	swaggerFiles "github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	_ "go-admin/docs"
	"go-admin/internal/middleware"
	"go-admin/internal/routers/api"
	v1 "go-admin/internal/routers/api/v1"
	"go-admin/internal/routers/api/ws"
	"net/http"
)

func NewRouter() *gin.Engine {
	r := gin.New()
	r.Use(gin.Logger())
	r.Use(gin.Recovery())
	r.Use(middleware.Cors)
	chatRoom := ws.NewChatRoom()

	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
	r.GET("/exportExcel", api.ExportExcel)
	// 建立websock服务
	r.GET("/ws", chatRoom.WsConnHandle)
	r.LoadHTMLGlob("template/*")
	r.GET("/home", func(c *gin.Context) {
		c.HTML(http.StatusOK, "home.html", gin.H{
			"title": "Main website",
		})
	})

	dict := v1.NewDict()
	dictItem := v1.NewDictItem()
	dept := v1.NewDept()
	job := v1.NewJob()
	menu := v1.NewMenu()
	role := v1.NewRole()
	user := v1.NewUser()
	upload := v1.NewUpload()
	r.POST("/upload", upload.Upload)       // 上传
	r.POST("/login", user.LoginByPassword) // 账号密码登录
	apiv1 := r.Group("/api/v1", middleware.JWTAuth(), middleware.AccessLog(), middleware.Recovery())
	{

		apiv1.POST("/dict", dict.Create)              // 创建字典
		apiv1.GET("/dict", dict.List)                 // 获取字典列表
		apiv1.PUT("/dict", dict.Update)               // 修改字典
		apiv1.DELETE("/dict", dict.Deletes)           // 删除字典
		apiv1.GET("/dictDetailById", dict.DictDetail) // 获取字典详情

		apiv1.POST("/dictItem", dictItem.Create)                      // 创建字典项
		apiv1.GET("/dictItem", dictItem.List)                         // 获取字典列表
		apiv1.PUT("/dictItem", dictItem.Update)                       // 修改字典
		apiv1.DELETE("/dictItem", dictItem.Deletes)                   // 批量删除字典
		apiv1.GET("/dictItemList", dictItem.DictItemList)             // 根据字典type获取字典列表
		apiv1.GET("/dictItemDetailById", dictItem.DictItemDetailById) // 获取字典详情

		apiv1.POST("/dept", dept.Create)                  // 创建部门
		apiv1.PUT("/dept", dept.Update)                   // 修改部门
		apiv1.DELETE("/dept/:id", dept.Delete)            // 删除部门
		apiv1.GET("/deptTree", dept.GetDeptTree)          // 获取部门列表
		apiv1.GET("/deptDetailById", dept.DeptDetailById) // 获取部门详情

		apiv1.POST("/job", job.Create)                 // 创建岗位
		apiv1.GET("/job", job.List)                    // 获取岗位列表
		apiv1.GET("/jobDetailById", job.JobDetailById) // 获取字典详情
		apiv1.PUT("/job", job.Update)                  // 修改岗位
		apiv1.DELETE("/job", job.Deletes)              // 批量删除部门
		apiv1.GET("/jobListAll", job.ListAll)          // 获取岗位列表

		apiv1.POST("/menu", menu.Create)                  // 创建菜单
		apiv1.GET("/menuTree", menu.GetMenuTree)          // 获取菜单列表
		apiv1.GET("/menuDetailById", menu.MenuDetailById) // 获取菜单详情
		apiv1.PUT("/menu", menu.Update)                   // 修改菜单
		apiv1.DELETE("/menu/:id", menu.Delete)            // 删除部门
		apiv1.POST("/menuTree", menu.MenuTree)            // 根据用户角色key获取菜单

		apiv1.POST("/role", role.Create)                  // 创建角色
		apiv1.GET("/role", role.List)                     // 获取角色列表
		apiv1.DELETE("/role", role.Deletes)               // 批量删除角色
		apiv1.PUT("/role", role.Update)                   // 修改角色
		apiv1.GET("/roleDetailById", role.RoleDetailById) // 获取角色详情
		apiv1.GET("/roleListAll", role.ListAll)           // 获取角色列表

		apiv1.POST("/user", user.Create)                                    // 创建用户
		apiv1.GET("/user", user.List)                                       // 获取用户列表
		apiv1.GET("/userDetailById", user.UserDetailById)                   // 获取角色详情
		apiv1.PUT("/user", user.Update)                                     // 修改用户
		apiv1.DELETE("/user", user.Deletes)                                 // 批量删除用户
		apiv1.GET("/userInfo", user.GetUserInfo)                            // 获取用户信息
		apiv1.POST("/getTokenByRefreshToken", user.GetTGokenByRefreshToken) // 根据刷新token获取token
	}
	return r
}
